package com.taoding.hfhclient.rabbitmq;

import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author liuxinghong
 * @Description: rabbitmq队列创建及绑定
 * @date 2019/8/28 002811:37
 */
@Configuration
public class MQConfig {

    public static final String keys= ReadRoutingKey.read();//读取到的 key值
    /**
     * 打印交换机名称
     */
    @Value("${rabbitmq.printer-exchange-name}")
    private   String printerExchangeName ;

    /**
     * 申明打印交换机,direct模式，根据routingkey发送到各个队列中
     */
    @Bean
    public Exchange printerExchange() {
        return ExchangeBuilder.directExchange(printerExchangeName).durable(true).build();
    }
    /**
     * 创建打印队列
     * @return
     */
    @Bean
    public Queue createPrinterQueue(){

        return QueueBuilder
            .durable(keys)
            .withArgument("x-queue-mode","lazy") //懒加载 设置队列为懒人模式.该模式下的队列会先将交换机推送过来的消息(尽可能多的)保存在磁盘上,以减少内存的占用.当消费者开始消费的时候才加载到内存中;如果没有设置懒人模式,队列则会直接利用内存缓存,以最快的速度传递消息.
//          .autoDelete() 队列不使用时可以自动删除
            .build();
    }

    /**
     * 打印队列绑定交换机
     */

    @Bean
    public Binding bindExChange(Exchange printerExchangeName, Queue printerQueue){
        return BindingBuilder.bind(printerQueue).to(printerExchangeName).with(keys).noargs();
    }

//    //设置消息处理失败时的重试策略(使用spring的重试机制 配置参考：https://www.jianshu.com/p/4904c609632f)
//    @Bean
//    public RetryOperationsInterceptor rabbitSourceRetryInterceptor() {
//        return RetryInterceptorBuilder.stateless()
//                .maxAttempts(30) //最大重试次数
//                .backOffOptions(5000, 1.2, 60000)  //初始重试间隔为 5000 毫秒，增加倍数为 1.2 倍，最大重试间隔为 60000 毫秒
//                .recoverer(new RejectAndDontRequeueRecoverer())
//                .build();
//    }
}
